package com.coderman.infosys.auth.app.eventhandler;

import com.coderman.infosys.auth.domain.bo.event.UserGroupCreatedEvent;
import com.coderman.infosys.auth.domain.enums.BOIdentiferEnum;
import com.coderman.infosys.auth.domain.gataway.CacheServiceGataWay;
import com.coderman.infosys.auth.domain.gataway.MessageServiceGataway;
import com.coderman.infosys.auth.domain.support.bo.UserBO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.event.TransactionalEventListener;

/**
 * Description:
 * date: 2022/1/8
 *
 * @author shenshuai
 * @version 1.0.0
 * @since JDK 1.8
 */
@Component
public class UserGroupCreatedEventHandler implements TransEventHandler<UserGroupCreatedEvent>{

    @Autowired
    private CacheServiceGataWay cacheServiceGataWay;

    @Autowired
    private MessageServiceGataway messageServiceGataway;

    //事务提交成功后给用户发送短信并且准备构建缓存
    @TransactionalEventListener(fallbackExecution = true)
    @Override
    public void handleTransEvent(UserGroupCreatedEvent userGroupCreatedEvent) {
        //1.给用户发送短信
        //2.构建用户组缓存

        //注意这里由于禁止了跨层调用，所以对于上面两个需求在事务结束后其实还相对麻烦了一点，
        //由于是异步的，所以这些逻辑如果放到了基础设施层就会变得有点割裂，如果是放到了应用层而禁止了
        //跨层调用所以会显得束手束脚，这里给出几个可以实现的方案，当然都有优缺点
        //1.允许应用层直接调用基础设施层的能力服务-->解除跨层调用
        //2.将eventHandler类挪到基础设施层
        //3.在领域层对给用户发送短信的接口下游依赖的服务做一个接口包装类似于ACL,
        //4.同理在领域层对需要操作缓存的地方构建一个缓存接口声明，在基础设施层实现并依赖缓存client


        //现在我们采用第三和第四种方式
        for (UserBO userBO : userGroupCreatedEvent.userGroupBO.getUserBOList()){
            messageServiceGataway.sendUserShortMessage(userBO.getUserId(),"msg content");
        }
        /**
         * 构建缓存
         */
        cacheServiceGataWay.put(BOIdentiferEnum.USER_GROUP, userGroupCreatedEvent.userGroupBO);


    }
}
